lpunbfandomcom-20200214-history
Seminário LUA 2/2013
Lua é uma linguagem de programação criada em 1993 por uma equipe de desenvolvedores da PUC-Rio. A linguagem originalmente foi criada para um projeto da Petrobrás, mas hoje é usada em diversos ramos. É uma linguagem considerada multi-paradigma, pois possui recursos que permitem que usá-la de forma funcional ou orientada a objetos. É simples, rápida e portátil. Por essas razões e o fato de ser tão flexível, Lua é hoje a linguagem de script mais usada no mundo em jogos. A linguagem Lua Lua é uma linguagem desenvolvida em C ANSI com o propósito de proporcionar um suporte para scripting a aplicações de forma leve e poderosa. É uma linguagem de extensão, o que siginifica que não existe o conceito de um programa principal em Lua. Ela funciona embarcada em um programa hospedeiro que pode chamar funções Lua ou registrar funções C para serem usadas pelo código Lua. Paradigmas Apesar de ser primariamente uma linguagem projetada para dar suporte para a programação procedimental, Lua oferece vários recursos que permitem um bom programador trabalhar em paradigmas diversos, como programação funcional ou orientada a objetos. Por exemplo, Lua não possui apoio direto a heranças, mas permite que metatables sejam utilizadas para simular esse recurso. De fato, Lua nem sequer possui recursos de Programação Orientada a Objeto, mas os conceitos de tabelas e meta-tabelas permitem que se implemente um tipo de específico de POO, onde classes filhas são implementadas como objetos de suas classes pais. De forma parecida, é possível se usar de artifícios da linguagem e da versatilidade das tabelas para simular recursos de programação funcional. Por exemplo, é possível criar funções que fazem com que tabelas sejam tratadas como listas imutáveis. Usando Lua Uma vez que o interpretador esteja instalado, é muito fácil usar Lua. Como não há o conceito de um programa principal, muito menos uma função main, qualquer comando passado para o interpretador é executado. Abaixo está um programa completo para imprimir "Olá mundo" na tela. print("Ola Mundo") Esse programa pode ser executado de várias formas. Direto pelo terminal usando o comando -e: $lua -e print("Ola Mundo") Com o modo interativo: $ lua > print("Ola Mundo") Escrevendo o programa em um arquivo e executando: $ lua nome-do-arquivo Ou chamando o arquivo através do modo interativo: $ lua > dofile("nome-do-arquivo") Variáveis Lua é uma linguagem de tipagem dinâmica. Isso significa que a linguagem faz a verificação de tipo em tempo de execução do programa. Por causa disso, não há declaração de tipos quando se declara uma variável. Exemplo: function add (a) local sum = 0 for i = 1, #a do sum = sum + ai end return sum end O programa acima soma todos os elementos de um vetor. O modificador local configura uma variável local, que só é visível no escopo da função que a chama. Funções Funções em Lua são valores dinâmicos. Todas as funções em Lua sã criadas dinamicamente. Em particular isso siginifica que podemos por exemplo, armazenar o valor de uma função em uma variável global: > foo = function (a,b) print(a+b) end > foo(10, 20) Lua provê um atalho sintático para isso na forma: function foo (a,b) print(a+b) end Que se assemelha a declaração de funções nas linguagens usuais. Funções em Lua podem retornar múltiplos valores e similarmente, fazer associações múltiplas. Por exemplo function foo (x) return x, x+1 end print(foo(3)) --> 3 4 a, b = foo(10) Tipos de Dados Os dados em Lua podem ser de oito tipos básicos: nil, lógico, number, string, function, userdata, thread e table. ''Tipo nil O tipo nil representa o valor indefinido. Todas as variáveis ainda não inicializadas assumem o valor nil . 'Tipo lógico' O tipo lógico, também conhecido como tipo booleano, pode assumir somente dois valores: verdadeiro (true) ou falso (false). 'Tipo Number' O tipo number representa valores numéricos. Lua não faz distinção entre valores numéricos com valores inteiros e reais. Todos os valores numéricos são tratados como sendo do tipo number. '''Tipo String ' O tipo string representa cadeia de caracteres. Uma cadeia de caracateres em Lua é definida por uma seqüência de caracteres delimitadas por aspas simples (' ') ou duplas (" "). s = "Marca d'agua" Tipo Function Funções em Lua são consideradas valores de primeira classe. Isto significa que funções podem ser armazenadas em variáveis, passadas como parâmetros para outras funções, ou retornadas como resultados. function func1 (...) ... end Tipo Userdata O tipo userdata permite armazenar numa variável de Lua um ponteiro qualquer de C. Este tipo corresponde ao tipo void* de C e somente pode ser atribuído ou comparado para igualdade a outro valor de mesmo tipo em Lua. Tipo Thread O tipo thread representa diferentes fluxos de execução, sendo utilizado para implementar subrotinas (coroutines). Não confundir Lua threads com as do sistema operacional. Lua suporta subrotinas em todos os sistemas, mesmo os que não possuem suporte a threads. function func_secundaria (a) print("func_secundaria", a) return coroutine.yield(2 * a) end co_rotina= coroutine.create( function (a,b) print("co_rotina", a, b) local r = func_secundaria(a + 1) print("co_rotina", r) local r, s = coroutine.yield(a + b, ab) print("co_rotina", r, s) return b, "fim" end) Tipo Table O tipo table (tabela) é o tipo mais expressivo da linguagem. Este tipo implementa os chamados vetores associativos, que permitem indexação por valores de qualquer outro tipo, com exceção do tipo nil. A partir de table, é possível implementar diversas estruturas de dados, como arrays comuns, tabela de símbolos, conjuntos, registros, grafos, árvores, etc. Imprementa estruturas de dados como Arrays, listas entre outros. São implementadas tambem conceitos mais abstratos como Objetos e Classe. expressao{} -- Cria lista vazia e retorna uma referência para ela. tx = y -- Associa y a chave x na tabela referenciada por t. Nas tabelas as chaves não podem ter o valor nil. t = {} t"x" = 10; t.y =20; printf(t.x, t"y") --> 10 20 Closures Escopo léxico. Uma função incluída dentro de outra função passa a ter acesso as variáveis locais.